<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>03_Object扩展</title>
</head>
<body>
<!--
ES5给Object扩展了好一些静态方法, 常用的2个:
1. Object.create(prototype, [descriptors])
  * 作用: 以指定对象为原型创建新的对象
  * 为新的对象指定新的属性, 并对属性进行描述
    value : 指定值
    writable : 标识当前属性值是否是可修改的, 默认为false
    configurable: 标识当前属性是否可以被删除 默认为false
    enumerable： 标识当前属性是否能用for in 枚举 默认为false

2. Object.defineProperties(object, descriptors)
  * 作用: 为指定对象定义扩展多个属性
  * get ：用来获取当前属性值得回调函数
  * set ：修改当前属性值得触发的回调函数，并且实参即为修改后的值
  * 存取器属性：setter,getter一个用来存值，一个用来取值
-->
<script type="text/javascript">
  // var obj={name:'独孤求败',age:40};
  // var obj1={};
  // // 创建对象
  // obj1=Object.create(obj,{
  //   sex:{
  //     // 扩展属性
  //     value:'男',
  //     // 是否允许修改
  //     writable:true,
  //     // 是否允许删除
  //     configurable:true,
  //     // 枚举扩展的属性
  //     enumerable:true
  //   }
  // });
  // console.log(obj1);
  // console.log(obj1.sex);
  // // 修改属性
  // obj1.sex='女';
  // console.log(obj1.sex);
  // // 删除属性
  // delete obj1.sex;
  // console.log(obj1);
  // // 枚举扩展的属性
  // for(var i in obj1){
  //   console.log(i+obj1[i]);
  // }

  var obj2={firstName:'kobe',lastName:"bryant"};
  Object.defineProperties(obj2,{
    // 创建的属性
    fullName:{
      get:function(){//获取扩展属性的值
        return this.firstName+' '+this.lastName;
      },
      set:function(data){//监听扩展属性的改变,将变化的值作为参数传到过来，并自动调用
        console.log('set(),',data);//无法修改扩展属性的值，可修改原来的属性

        var namse=data.split(' ');
        this.firstName=namse[0];
        this.lastName=namse[1];

      }
    }
  });
  console.log(obj2);
  console.log(obj2.fullName);//kobe bryant
  // 修改属性
  obj2.fullName='tim dgqb';
  console.log(obj2.fullName);//kobe bryant tim dgqb


</script>
</body>
</html>
